package br.com.webservicedelivery.bean;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;

import br.com.webservicedelivery.dao.ClienteDAO;
import br.com.webservicedelivery.dao.ItensPedidoDAO;
import br.com.webservicedelivery.dao.PedidoDAO;
import br.com.webservicedelivery.dao.ProdutoDAO;
import br.com.webservicedelivery.domain.Cliente;
import br.com.webservicedelivery.domain.ItensPedido;
import br.com.webservicedelivery.domain.Pedido;
import br.com.webservicedelivery.domain.Produto;
import br.com.webservicedelivery.util.FacesUtil;

@ManagedBean
@ViewScoped
public class PedidoBean {

	private List<Produto> listaProdutos;
	private List<Produto> listaProdutosFiltrados;

	private List<ItensPedido> listaItens;
	
	private Pedido pedidoCadastro;
	
	@ManagedProperty(value="#{autenticacaoBean}")
	private AutenticacaoBean autenticacaoBean;

	public List<Produto> getListaProdutos() {
		return listaProdutos;
	}

	public void setListaProdutos(List<Produto> listaProdutos) {
		this.listaProdutos = listaProdutos;
	}

	public List<Produto> getListaProdutosFiltrados() {
		return listaProdutosFiltrados;
	}

	public void setListaProdutosFiltrados(List<Produto> listaProdutosFiltrados) {
		this.listaProdutosFiltrados = listaProdutosFiltrados;
	}

	
	public Pedido getPedidoCadastro() {
		if(pedidoCadastro == null){
			pedidoCadastro = new Pedido();
			pedidoCadastro.setValor(new BigDecimal("0.00"));
		}
		return pedidoCadastro;
	}

	public void setPedidoCadastro(Pedido pedidoCadastro) {
		this.pedidoCadastro = pedidoCadastro;
	}

	public List<ItensPedido> getListaItens() {
		if (listaItens == null) {
			listaItens = new ArrayList<>();
		}
		return listaItens;
	}

	public void setListaItens(List<ItensPedido> listaItens) {
		this.listaItens = listaItens;
	}
	
	public AutenticacaoBean getAutenticacaoBean() {
		return autenticacaoBean;
	}

	public void setAutenticacaoBean(AutenticacaoBean autenticacaoBean) {
		this.autenticacaoBean = autenticacaoBean;
	}

	public void carregarProdutos() {
		try {
			ProdutoDAO produtoDAO = new ProdutoDAO();
			listaProdutos = produtoDAO.listar();
		} catch (RuntimeException ex) {
			FacesUtil.adicionarMsgErro("Erro ao tentar listar os produtos: "
					+ ex.getMessage());
		}
	}

	public void adicionar(Produto produto) {
		int posicaoEncontrada = -1;

		for (int pos = 0; pos < listaItens.size() && posicaoEncontrada < 0; pos++) {
			ItensPedido itemTemp = listaItens.get(pos);

			if (itemTemp.getProduto().equals(produto)) {
				posicaoEncontrada = pos;

			}
		}

		ItensPedido item = new ItensPedido();
		item.setProduto(produto);

		if (posicaoEncontrada < 0) {
			item.setQuantidade(1);
			item.setValorParcial(produto.getPreco());
			listaItens.add(item);
		} else {
			ItensPedido itemTemp = listaItens.get(posicaoEncontrada);
			item.setQuantidade(itemTemp.getQuantidade() + 1);
			item.setValorParcial(produto.getPreco().multiply(
					new BigDecimal(item.getQuantidade())));
			listaItens.set(posicaoEncontrada, item);
		}
		pedidoCadastro.setValor(pedidoCadastro.getValor().add(produto.getPreco()));
	}

	public void remover(ItensPedido item) {
		int posicaoEncontrada = -1;

		for (int pos = 0; pos < listaItens.size() && posicaoEncontrada < 0; pos++) {
			ItensPedido itemTemp = listaItens.get(pos);

			if (itemTemp.getProduto().equals(item.getProduto())) {
				posicaoEncontrada = pos;

			}
		}
			if (posicaoEncontrada > -1){
				listaItens.remove(posicaoEncontrada);
				pedidoCadastro.setValor(pedidoCadastro.getValor().subtract(item.getValorParcial()));
				
			}
	}
	public void carregarDadosPedido(){
		pedidoCadastro.setHorario(new Date());
		
		ClienteDAO clienteDAO = new ClienteDAO();
		Cliente cliente = clienteDAO.buscarPorId(autenticacaoBean.getClienteLogado().getIdCliente());
		pedidoCadastro.setCliente(cliente);
	}
	public void salvar(){
		try {
			PedidoDAO pedidoDAO = new PedidoDAO();
			Long idPedido = pedidoDAO.salvar(pedidoCadastro);
			Pedido pedidoFK = pedidoDAO.buscarPorId(idPedido);
			
			for(ItensPedido item : listaItens){
				item.setPedido(pedidoFK);
				
				ItensPedidoDAO itensPedidoDAO = new ItensPedidoDAO();
				itensPedidoDAO.salvar(item);
			}
			
			pedidoCadastro = new Pedido();
			pedidoCadastro.setValor(new BigDecimal("0.00"));
			
			listaItens = new ArrayList<ItensPedido>();
			
			FacesUtil.adicionarMsgInfo("Pedido salvo com sucesso");
		} catch (RuntimeException ex) {
			FacesUtil.adicionarMsgErro("Erro ao tentar salvar o pedido: "
					+ ex.getMessage());
		}
		
	}
}
